#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <mqueue.h>
#include <string.h>

static char *mq_name = "/xxx"; // dev/mqueue目录
static mqd_t mqd; // 消息队列描述符

void *first_thread_func(void *arg)
{
    printf("first %d开始执行\n",gettid());

    // 发送消息
    char *msg = "hello world";
    if (mq_send(mqd, msg, strlen(msg) + 1, 1) == -1) {
        printf("消息发送失败");
    }
    else
    {
        printf("消息发送成功");
    }
}

void *second_thread_func(void *arg)
{
    printf("second thread\n");

    // 接收消息
    char msg[100];
    if (mq_receive(mqd, msg, 100, NULL) == -1) {
        printf("消息接收失败");
    }
    else
    {
        printf("消息接收成功");
    }
}

int main(int argc, char const *argv[])
{
    //队列属性
    struct mq_attr attr;
    attr.mq_maxmsg = 10;  // 消息队列中最大消息数
    attr.mq_msgsize = 50; // 每条消息的最大字节数
    // 创建消息队列
    mqd = mq_open(mq_name, O_RDWR | O_CREAT, 0644, &attr);
    if (mqd == (mqd_t)-1) {
        printf("消息队列创建失败");
        return -1;
    }

    //创建分线程
    pthread_t pt1, pt2;
    pthread_create(&pt1, NULL, (void *)first_thread_func, NULL);
    pthread_create(&pt2, NULL, (void *)second_thread_func, NULL);

    // 等待线程结束
    pthread_join(pt1, NULL);
    pthread_join(pt2, NULL);

    // 关闭消息队列
    mq_close(mqd);

    
    return 0;
}
